package cn.wggf.dev.qcgg.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 
 * JSON 工具类
 * 
 * @author Yubo Jia
 *
 */
public class JSONUtil {
	/**
	 * 
	 * 将 java 对象转换为 json 字符串
	 * 
	 * @param t 被转换为 json 字符串的 java 对象
	 * @return java 对象转换的 json 字符串
	 * 
	 */
	public static <T> String objectToJson(T t) {
		// 将 java 对象转换为 json 字符串
		JSONObject jo = JSONObject.fromObject(t);
		
		return jo.toString();
	}
	
	/**
	 * 
	 * 将 java 数组转化为 json 字符串
	 * 
	 * @param t 被转换为 json 字符串的 java 数组
	 * @return java 数组转化的 json 字符串
	 * 
	 */
	public static <T> String arrayToJson(T[] t) {
		// 将 java 数组转化为 json 字符串
		JSONArray ja = JSONArray.fromObject(t);

		return ja.toString();
	}
	
	/**
	 * 
	 * 将 java Collection 转化为 json 字符串
	 * 
	 * @param c 被转换为 json 字符串的 java Collection 
	 * @return java Collection 转化的 json 字符串
	 * 
	 */
	public static <T> String collectionToJson(Collection<T> c) {
		// 将 java Collection 转化为 json 字符串
		JSONArray ja = JSONArray.fromObject(c);

		return ja.toString();
	}
	
	/**
	 * 
	 * 将 java List 转化为 json 字符串
	 * 
	 * @param l 被转换为 json 字符串的 java List
	 * @return java List 转化的 json 字符串
	 * 
	 */
	public static <T> String listToJson(List<T> l) {
		return collectionToJson(l);
	}
	
	/**
	 * 
	 * 将 java Set 转化为 json 字符串
	 * 
	 * @param s 被转换为 json 字符串的 java Set
	 * @return java Set 转化的 json 字符串
	 * 
	 */
	public static <T> String setToJson(Set<T> s) {
		return collectionToJson(s);
	}
	
	/**
	 * 
	 * 将 java Map 转化为 json 字符串
	 * 
	 * @param m 被转换为 json 字符串的 java Map
	 * @return java Map 转化的 json 字符串
	 * 
	 */
	public static <T> String mapToJson(Map<String, T> m) {
		// 将 java 对象转换为 json 字符串
		JSONObject jo = JSONObject.fromObject(m);
				
		return jo.toString();
	}
	
	/**
	 * 
	 * 将 json 字符串转换为 java 对象
	 * 
	 * @param json json 字符串
	 * @param clazz json 字符串转换为 java 对象的类类型
	 * @return josn 字符串转换的 java 对象
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> T jsonToObject(String json, Class<T> clazz) {
		// 将 json 字符串转换为 json 对象
		JSONObject jo = JSONObject.fromObject(json);
		// 将 json 对象转换为 java 对象
		T t = (T) JSONObject.toBean(jo, clazz);
		
		return t;
	}
	
	/**
	 * 
	 * 将 json 字符串转换为 java 数组
	 * 
	 * @param json json 字符串
	 * @param clazz json 字符串转换为 java 数组的元素的类类型
	 * @return josn 字符串转换的 java 数组
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> T[] jsonToArray(String json, Class<T> clazz) {
		// 将 json 字符串转换为 json 数组
		JSONArray ja = JSONArray.fromObject(json);
		// 将 json 数组转换为 java 数组
		T[] ts = (T[]) JSONArray.toArray(ja, clazz);
		
		return ts;
	}
	
	/**
	 * 
	 * 将 json 字符串转换为 java Collection 
	 * 
	 * @param json json 字符串
	 * @param clazz json 字符串转换为 java Collection 的元素的类类型
	 * @return josn 字符串转换的 java Collection 
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> Collection<T> jsonToCollection(String json, Class<T> clazz) {
		// 将 json 字符串转换为 json 数组
		JSONArray ja = JSONArray.fromObject(json);
		// 将 json 数组转换为 java Collection 
		Collection<T> c = JSONArray.toCollection(ja, clazz);
		
		return c;
	}
	
	/**
	 * 
	 * 将 json 字符串转换为 java List
	 * 
	 * @param json json 字符串
	 * @param clazz json 字符串转换为 java List 的元素的类类型
	 * @return josn 字符串转换的 java List
	 * 
	 */
	public static <T> List<T> jsonToList(String json, Class<T> clazz) {
		return new ArrayList<T>(jsonToCollection(json, clazz));
	}
	
	/**
	 * 
	 * 将 json 字符串转换为 java Set
	 * 
	 * @param json json 字符串
	 * @param clazz json 字符串转换为 java Set 的元素的类类型
	 * @return josn 字符串转换的 java Set
	 * 
	 */
	public static <T> Set<T> jsonToSet(String json, Class<T> clazz) {
		return new HashSet<T>(jsonToCollection(json, clazz));
	}
	
	/**
	 * 
	 * 将 json 字符串转换为 java Map
	 * 
	 * @param json json 字符串
	 * @param clazz json 字符串转换为 java Map 的元素的类类型
	 * @return josn 字符串转换的 java Map
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> Map<String, T> jsonToMap(String json, Map<String, Class<T>> map) {
		// 将 json 字符串转换为 json 对象
		JSONObject jo = JSONObject.fromObject(json);
		// 将 json 对象转换为 java Map
		Map<String, T> m = (Map<String, T>) JSONObject.toBean(jo, map.getClass(), map);
		
		return m;
	}
}